package com.fang.api_encryption.rsa;

import com.fang.api_encryption.cryptoUtil.CryptoUtils;
import com.fang.api_encryption.cryptoUtil.Encryption;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * @Description RSA 使用PKCS1 格式的密钥对加密工具类
 * @Author Bernie_fang
 * @Date 2023/12/4 22:57
 **/
@Component
public class RSACryptoUtil {
    @Autowired
    private RSAKeyPKCS1 rsaKeyPKCS1;

    /*
    加密解密: 前端用公钥加密密码,传给后端,后端用私钥解密获取密码明文,不可以用私钥加密用公钥解密,这样会报错，
    公钥加密私钥解密是用来防止消息泄露的,即使加密后的消息被他人获取,在没有私钥的情况下也无法知道原文.

    签名验签: A给B发消息,A用私钥将消息加签,将加签的消息和原消息一起发给B,B收到消息后用公钥验签,验签通过说明消息确实是A发送的.
    加签的消息都是加密后的消息,一般不会对明文进行加签, 私钥签名公钥验签是为了防止信息被篡改的,
     */

    /*
    加密：公钥加密，私钥解密
    签名：私钥签名，共钥验签
     */

    /*
       一般情况下，需要加密的信息，客户端会提前先服务端申请公钥(一次性)，然后加密后发送加密信息
    */

    public String encryptByRSAPKCS1(String plainText) throws Exception {
        String cipherText = CryptoUtils.encryptAsymmetrically(this.rsaKeyPKCS1.getPublicKeyStr(), plainText,  Encryption.RSA_ECB_PKCS1);
        return cipherText;
    }

    public String decryptByRSAPKCS1(String cipherText) throws Exception {
        String plainText = CryptoUtils.decryptAsymmetrically(this.rsaKeyPKCS1.getPrivateKeyStr(), cipherText, Encryption.RSA_ECB_PKCS1);
        return plainText;
    }

    public boolean verifyBySHA256WithRSA(String plainText, String signature) throws Exception {
        boolean isVerified = CryptoUtils.verifyBySHA256WithRSA(this.rsaKeyPKCS1.getPublicKeyStr(), plainText, signature);
        return isVerified;
    }

    public String signBySHA256WithRSA(String plainText) throws Exception {
        String signature = CryptoUtils.signBySHA256WithRSA(this.rsaKeyPKCS1.getPrivateKeyStr(), plainText);
        return signature;
    }

}
